/*
 * salida.cpp
 *
 *  Created on: 01/07/2014
 *      Author: nicolas
 */

#include <stdlib.h>

#include <syslog.h>
#include <stdio.h>

#include "../interfaces/iPersonaPuerta.h"
#include "../comun/ParqueRemoto.h"
#include "../ipcRemoto/SemaforoRemoto.h"
#include "../ipc/Semaforo.h"

int main(int argc, char **argv) {

	/*
	 * Repetir:
	 *
		 * Recibir mensaje de persona que quiere salir
		 *
		 * tomar shmem parque
		 *
		 * decrementar el contador
		 *
		 * liberar shmem
		 *
		 * enviar mensaje a persona que puede salir
	 *
	 */
	if (argc < 2) {
		// TODO avisar que se tiene que ingresar numero de puerta
		return 1;
	}

	int numPuerta = atoi(argv[1]);

	char encabezado[80];
	sprintf(encabezado, "PuertaSalida %i", numPuerta);
	openlog(encabezado, LOG_PID | LOG_CONS, LOG_LOCAL0);


	iPersonaPuerta ipersona(numPuerta);
	ipersona.tipo(Tipos::PUERTA_SALIDA);

	//Parque parque;
	ParqueRemoto parque(ipersona.idPuerta(), ipersona.idBroker());

	//iSemaforo *mtxParque = new Semaforo(RUTA, 1, ID_MUTEX_PARQUE);
	iSemaforo *mtxParque = new SemaforoRemoto(ID_MUTEX_PARQUE, ipersona.idPuerta(), ipersona.idBroker());


	int idPersona;

	//mtxParque->wait();
	while (true) {

		idPersona = ipersona.esperarPartidaDePersona();


		syslog(LOG_INFO, "TOMANDO MUTEX del PARQUE");
		mtxParque->wait();
		parque.registrarSalida(idPersona);
		mtxParque->signal();
		syslog(LOG_INFO, "LIBERANDO MUTEX del PARQUE");

		ipersona.confirmarPartida(idPersona);

	}
	//mtxParque->signal();

	return 0;
}



